package thread;

import conn.SocketManager;

import java.io.BufferedReader;
import java.io.IOException;

/**
 * Thread per il controllo dell'input del client proveniente dal server.
 *
 * @author Claudio "Dna" Bonesana
 */
public class InputThread extends Thread {

    private SocketManager socketManager;
	private BufferedReader bufferedReader;
	
	private volatile boolean working;

    /**
     *  Crea un nuovo {@link InputThread}. Prima di eseguirlo occorre associare il {@link SocketManager} che controllerà
     *  questo Thread e il {@link BufferedReader} su cui andrà a leggere i dati provenienti dal server.
     */
	public InputThread() {
		this.working = true;
	}

    /**
     * @param socketManager un {@link SocketManager} valido
     */
    public void setSocketManager(SocketManager socketManager) {
        this.socketManager = socketManager;
    }

    /**
     * @param bufferedReader    un {@link BufferedReader} valido proveniente dal socket.
     */
    public void setBufferedReader(BufferedReader bufferedReader) {
        this.bufferedReader = bufferedReader;
    }

    /**
     * Interrompe l'esecuzione del thread.
     */
    public synchronized void stopThread(){
		working = false;
	}

    /**
     * La thread rimane in attesa sul canale di lettura del socket. Nel caso in cui il canale venga chiuso, segnala al
     * {@link SocketManager} e richiede un tentativo di riconnessione.
     */
	@Override
	public void run() {
		while(working){
			try {
				String str = bufferedReader.readLine();     /*  bloccante   */
                if (str == null){
					socketManager.attemptReconnect();       /*  in caso in cui il socket cade tenta una nuova connessione   */
                    break;
				} else {
                    socketManager.updateClientWindow(str);  /*  altrimenti aggiorna la gui  */
				}
			} catch (IOException e) {
				break;
			}
		}
		try {
			bufferedReader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
